package com.mango.leet.code.week1.game289;

/**
 * 6071. 完成所有任务需要的最少轮数
 * @Author: mango
 * @Date: 2022/4/17 10:46 上午
 */

import java.util.HashMap;
import java.util.Queue;
import java.util.Stack;

/**
 * 给你一个下标从 0 开始的整数数组 tasks ，其中 tasks[i] 表示任务的难度级别。在每一轮中，你可以完成 2 个或者 3 个 相同难度级别 的任务。
 *
 * 返回完成所有任务需要的 最少 轮数，如果无法完成所有任务，返回 -1 。
 *
 *
 *
 * 示例 1：
 *
 * 输入：tasks = [2,2,3,3,2,4,4,4,4,4]
 * 输出：4
 * 解释：要想完成所有任务，一个可能的计划是：
 * - 第一轮，完成难度级别为 2 的 3 个任务。
 * - 第二轮，完成难度级别为 3 的 2 个任务。
 * - 第三轮，完成难度级别为 4 的 3 个任务。
 * - 第四轮，完成难度级别为 4 的 2 个任务。
 * 可以证明，无法在少于 4 轮的情况下完成所有任务，所以答案为 4 。
 * 示例 2：
 *
 * 输入：tasks = [2,3,3]
 * 输出：-1
 * 解释：难度级别为 2 的任务只有 1 个，但每一轮执行中，只能选择完成 2 个或者 3 个相同难度级别的任务。因此，无法完成所有任务，答案为 -1 。
 *
 *
 * 提示：
 *
 * 1 <= tasks.length <= 105
 * 1 <= tasks[i] <= 109
 */
public class LC6071 {
    public static void main(String[] args) {
        //int[] tasks = {2,2,3,3,2,4,4,4,4,4};
        int[] tasks = {66,66,63,61,63,63,64,66,66,65,66,65,61,67,68,66,62,67,61,64,66,60,69,66,65,68,63,60,67,62,68,60,66,64,60,60,60,62,66,64,63,65,60,69,63,68,68,69,68,61};
        System.out.println(new Solution().minimumRounds(tasks));
    }
    static class Solution {
        public int minimumRounds(int[] tasks) {
            // 计数
            HashMap<Integer,Integer> countMap = new HashMap<>();
            for(int i=0;i<tasks.length;i++){
                int val = tasks[i];
                countMap.put(val,countMap.getOrDefault(val,0)+1);
            }
            // 处理
            int result = 0;
            for(Integer num : countMap.keySet()){
                Integer count = countMap.get(num);
                while(count != 0) {
                    // 小于2，无法取出
                    if(count<2){
                        return -1;
                    }
                    if(count == 4){
                        count = 0;
                        result += 2;
                    }else if(count > 3){
                        // 减3
                        count -= 3;
                        result ++;
                    }else if(count == 3){
                        count = 0;
                        result ++;
                    }else if(count == 2){
                        count = 0;
                        result++;
                    }
                }
            }
            return result;
        }
    }
}
